package cn.tedu.charging.account.service.geo;

import cn.tedu.charging.account.pojo.entity.ChargingStation;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;

import java.util.Collection;
import java.util.List;

/**
 * Geo服务接口定义
 *
 * @author wyy
 * @version 1.0
 */
public interface IRedisGeoCache {

    /**
     * 把充电站信息保存到 Redis中
     *
     * @param chargingStations 充电站
     * @return 成功保存的个数
     * */
    Long saveChargingStationToRedis(Collection<ChargingStation> chargingStations);

    /**
     * 从Redis中移除充电站信息
     *
     * @param chargingStation 充电站
     * @return 成功移除的个数
     */
    Long removeChargingStationToRedis(ChargingStation chargingStation);

    /**
     * 获取给定充电站的坐标
     *
     * @param chargingStation 给定充电站的key
     * @return
     * */
    List<Point> getChargingStationPos(Long[] chargingStation);

    /**
     * 获取两个充电站之间的距离
     *
     * @param station1 第一个城市
     * @param station2 第二个城市
     * @param metric 单位信息, 可以是 null
     * @return {@link Distance}
     * */
    Distance getTwoStationsDistance(Long station1, Long station2, Metric metric);

    /**
     * 根据给定地理位置坐标获取指定范围内的地理位置集合
     *
     * @param within {@link Circle} 中心点和距离
     * @param args {@link RedisGeoCommands.GeoRadiusCommandArgs} 限制返回的个数和排序方式, 可以是 null
     * @return {@link RedisGeoCommands.GeoLocation}
     * */
    GeoResults<RedisGeoCommands.GeoLocation<Long>> getPointRadius(
            Circle within, RedisGeoCommands.GeoRadiusCommandArgs args);

    /**
     * 根据给定地理位置获取指定范围内的地理位置集合
     * */
    GeoResults<RedisGeoCommands.GeoLocation<Long>> getMemberRadius(
            Long member, Distance distance, RedisGeoCommands.GeoRadiusCommandArgs args);

    /**
     * 获取某个地理位置的 geohash值
     * @param stations 给定充电站的key
     * @return station geohashs
     * */
    List<String> getStationGeoHash(Long[] stations);

}
